package com.gaga.console.core.controller.bv;


import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.aigc.generation.models.QwenParam;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.MessageManager;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.fastjson.JSON;
import com.gaga.common.enums.PlayerType;
import com.gaga.common.enums.ScriptType;
import com.gaga.common.path.ApiPath;
import com.gaga.common.result.Result;
import com.gaga.common.utils.FolderSelector;
import com.gaga.console.base.controller.BaseController;
import com.gaga.console.base.utils.VideoPlayerUtils;
import com.gaga.console.core.entity.dto.AudioPlayDto;
import com.gaga.console.core.entity.dto.TextToSpeechFrontDto;
import com.gaga.console.core.entity.vo.TextToSpeechVo;
import com.gaga.console.core.service.AudioPlayQueueService;
import com.gaga.console.core.service.BvModelService;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.IOException;


/**
 * 用户信息表 前端控制器
 *
 * @author liujia
 * @since 2025-03-27
 */
@RestController
@RequestMapping(ApiPath.ROOT + "/bv/test")
public class TestController extends BaseController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);
    @Autowired
    private AudioPlayQueueService audioPlayQueueService;

    @Autowired
    private ResourceLoader resourceLoader;

    @Autowired
    private BvModelService bvModelService;

    private final FolderSelector folderSelector = new FolderSelector();

    @ApiOperation(value = "testPlay")
    @PostMapping("/testPlay")
    public Result listModel() {
        AudioPlayDto audioDto2 = new AudioPlayDto().setAudioFilePath("C:/Users/lenovo/Desktop/test/6.wav").setScriptType(ScriptType.MAIN_AUDIO);
        AudioPlayDto audioDto3 = new AudioPlayDto().setAudioFilePath("C:/Users/lenovo/Desktop/test/1.wav").setScriptType(ScriptType.MAIN_AUDIO);
        audioPlayQueueService.addToQueue(audioDto2, PlayerType.ANCHOR);
        audioPlayQueueService.addToQueue(audioDto3, PlayerType.ANCHOR);
        return Result.ok();
    }

    @ApiOperation(value = "testStop")
    @PostMapping("/testStop")
    public Result testStop() {
        audioPlayQueueService.stopLive();
        return Result.ok();
    }

    @ApiOperation(value = "testVideoPlay")
    @PostMapping("/testVideoPlay")
    public Result testVideoPlay() throws IOException {
        VideoPlayerUtils.playVideo("C:\\Users\\lenovo\\Desktop\\test\\2.MP4");
        return Result.ok();
    }

    @ApiOperation(value = "createWindow")
    @PostMapping("/createWindow")
    public Result createWindow() throws IOException {
        Resource resource = resourceLoader.getResource("classpath:static/icons/window-icon.png");
        File iconFile = resource.getFile();
        VideoPlayerUtils.createWindow(800d, 600d, "", "green", iconFile);
        return Result.ok();
    }

    public static void callWithMessage()
            throws NoApiKeyException, ApiException, InputRequiredException {
        Generation gen = new Generation();
        Constants.apiKey = "sk-a4b626efd6734f4fad8a885fd3f26f83";//这里填写自己申请的APIKEY
        MessageManager msgManager = new MessageManager(10);
        Message systemMsg =
                Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build();
        Message userMsg = Message.builder().role(Role.USER.getValue()).content("帮我润色下下面的话术，直接返回一条话术，可以直接用于tts转语音使用，并屏蔽上线，需要润色的话术是：欢迎新进入直播间的姐妹，现在[时间]欢迎来到我的直播间，主播刚刚上线，刚进来的姐妹先别着急离开？").build();//这里填写对话内容
        msgManager.add(systemMsg);
        msgManager.add(userMsg);
        QwenParam param =
                QwenParam.builder().model(Generation.Models.QWEN_PLUS).messages(msgManager.get())
                        .resultFormat(QwenParam.ResultFormat.MESSAGE)
                        .topP(0.8)
                        .enableSearch(true)
                        .build();
        GenerationResult result = gen.call(param);
        System.out.println(result);
    }

    public static void main(String[] args) {
        try {
            callWithMessage();
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }


    @ApiOperation(value = "testSelectFolder")
    @PostMapping("/testSelectFolder")
    public Result testSelectFolder() {
        String selectFolder = folderSelector.selectFolder();
        log.info(selectFolder);

        return Result.ok();
    }

    @ApiOperation(value = "encryptFile")
    @PostMapping("/encryptFile")
    public Result encryptFile(@RequestBody JSON json) {
        String selectFolder = folderSelector.selectFolder();
        log.info(selectFolder);

        return Result.ok();
    }

    @ApiOperation(value = "test")
    @PostMapping("/test")
    public Result test() throws Exception {
        String dtoStr = "{\"blockWords\":\"\",\"channelId\":\"1\",\"generateAudioPath\":\"D:\\\\video\\\\v1.0\\\\云顶AI/generate_audio\\\\白凉粉\\\\mainAudio\\\\女士声音1\\\\38.0.txt\\\\1746100805193.wav\",\"liveRoomDesc\":\"## 一、智能体基础设定\\n### （一）身份与角色定位\\n作为一个农家小米的源头工厂，现场装袋的直播间主播。性格热情开朗、亲和力满满，仿若邻家小妹，真诚质朴，精通黄小米知识，以通俗活泼语言与观众互动，时刻留意需求，一心助力直播销售与口碑提升。\\n### （二）功能核心目标\\n1. **精准答疑**：聚焦农家黄小米，针对观众在价格、规格、品质、产地、加工工艺、售后等疑问，依知识库速给清晰详实解答，驱散疑虑。\\n2. **有效引导购买**：按观众询问情境，巧妙荐合适产品规格、套餐，用诱人话术凸显性价比与卖点，借限时优惠、库存压力激发购买欲，促成交易。\\n3. **互动维护氛围**：借亲切称呼、暖心回应、打趣调侃，强化情感纽带，营造轻松信任氛围，提升观众留存与参与度。\\n4. **注意**：在回复中不要出现动作描写、舞台提示语或情境描述语。不要使用括号展现动作之类的。在回复时严格控制在80字以内。\\n## 二、输入与输出规范设定\\n### （一）输入识别处理\\n1. **格式适配**：适配多样提问，像“多少钱？”类简洁问法，或“张三姐姐问：2.98 元的是多少？”这类亲昵详述，都能抓关键信息、领会意图，尤重称呼识别以拉近距离。\\n2. **语义解析**：利用先进技术剖析语义，锁定疑问领域，结合知识库精准匹配板块，面对模糊提问，依上下文推测，或询问确认、或给引导回复。\\n3. **特殊解析**：如遇观众打出“7679”类似的4位数阿拉伯数字。就是已下单的观众手机后4位，他的意思就是让你在现场打包发货。可以这样回答“好的，七六七九，看到你了，感谢你的支持。马上给你安排。”注意这种手机后四位，需要用大写的阿拉伯数字，不然系统会识别错误。\\n### （二）输出内容准则\\n1. **风格口吻**：秉持热情真诚贴心风，仿真人交流，开头重复称呼，句子灵活，插口语短句、感叹词添感染力，用俏皮话、流行梗活跃气氛，兼顾通俗与专业。\\n2. **内容完整性**：依知识库，全面阐释提问点。谈价格，比线上线下、讲优惠；说品质，描外观、口感、新鲜度；论售后，列退换、赔付流程，适时延展配套工具、食用场景，助推购买。\\n3.**注意**：绝对不能出现“最”“第一”“首家”“唯一”这些容易违规的极限词。遇到类似“2天、2晚、2人、2份”都写成“两天、两人、两晚、两份”。\\n## 三、导入知识库\\n1.产品基础信息\\n产品名称：农家（黄小米）\\n产品特点：二零二四年的头茬新小米，糯小米，色泽金黄，带着胚芽，有清香清甜米香味，口感软糯、入口回甘、口感绵密、细腻丝滑，米油厚密。\\n产地：黑龙江\\n发货地：河北粮仓\\n2.价格与优惠\\n活动价格：到手五斤，价格为 14.9 元；合到一斤不到3块。\\n价格对比：同等品质小米在当地商超、市场，打折后至少五六块一斤，直播间价格优惠力度大。\\n价格变动说明：活动价格限时，后续可能涨价，提醒用户趁活动购买。\\n3.试吃与售后\\n试吃政策：提供运费险和 7 天无理由试吃，支持收到货先拆开袋子试吃，可试吃 1 - 2 斤。若不满意，如熬不出米油、口感不好，可直接扔掉或退部分商品，商家退全款。\\n售后保障：足斤足秤，少一两赔一斤，少二两全赔；有问题包赔、包售后；提供运费险。\\n4.产品品质\\n种植方式：农家古法种植，不打农药，不上化肥，不抛光、不打蜡、不染色，非转基因老品种。\\n营养价值：富含大量人体所需维生素、微量元素，矿物质、蛋白质、碳水、膳食纤维、铁磷钙镁锌等含量是普通小米的三倍以上。\\n5.适用人群与应用场景\\n适用人群：孕妈妈（可作为月子米）、小宝宝（可作为辅食）、年龄大的叔叔阿姨（常吃可养身体，调理肠胃）、不能吃白米白面的人、上班族、沿海地区人群等。\\n应用场景：可煮小米粥（如小米南瓜粥、山药粥、红枣粥、菠菜粥、香菇粥、牛肉粥、瘦肉粥、鱼肉粥、海鲜粥、八宝粥等）、蒸小米饭、给小朋友打小米糊。\\n6.互动与引导\\n开场欢迎：欢迎不同称呼的观众进入直播间，询问是否新用户，引导新用户告知主播。\\n下单引导：鼓励用户下单，告知下单后发送手机后四位或购买斤数，主播安排现场装袋、装货，强调早拍早发货，当天有快递车。\\n关注引导：引导未关注用户点关注，方便售前售后，强调关注后回购方便。\\n逼单话术：告知用户活动难得，错过今天可能需等新米成熟才有此价格，提醒抓紧时间下单，下播后只能在橱窗购买。\\n用户反馈：对已下单用户表示感谢，回复用户关于快递、物流、开口器等问题，对新用户进行欢迎和引导。\\n## 四、优化与学习机制设定\\n### （一）用户反馈驱动优化\\n1. **评价收集**：直播后，经直播间留言、问卷集观众评价，分类标注满意、不满意因由，汇总成优化清单。\\n2. **针对性改进**：按清单纠错、澄清模糊表述、补缺失内容，调策略、优语言风格与推荐话术，提升交互质量。\\n3. • 规范对话内容格式：对话内容只包含角色说的话，像“小明说：‘今天天气不错。’”，而不包括“（小明抬头看了看天，微笑着）”这种舞台提示语。\\n### （二）数据挖掘辅助学习\\n1. **直播数据洞察**：深挖互动数据，析高频词、关注点、转化因素，洞察需求偏好，助知识库扩充、回答优化，强化卖点答疑。\\n2. **行业对标借鉴**：定期搜罗同行优质话术、产品亮点、售后创新，比对融合，保竞争优势，向专业贴心迈进。\\n\",\"modelId\":2,\"playerType\":\"ANCHOR\",\"promptText\":\"没有念到名字的后台小助理，帮我看好公屏，都帮我一个一个登记好库存。\",\"refAudioPath\":\"docs/fr\\\\女士声音1\\\\ck.wav\",\"repeatProblem\":false,\"repetitionPenalty\":1.35,\"scriptType\":\"MAIN_AUDIO\",\"seed\":-1,\"smartQA\":false,\"smartReply\":true,\"speedFactor\":1.0,\"temperature\":1.0,\"text\":\" {哥姐们|哥哥姐们|大哥大姐们|宝兹们你们放心购买带走。收到货后不会做的，无需担忧，每袋背面都有详细制作方法。粉和水按1比25的比例调配，新手按此操作也能一次做成功。\",\"token\":\"216483bc-08da-4070-a19b-0d984375cd4b\",\"topK\":5,\"topP\":1.0}";

        TextToSpeechFrontDto dto = JSON.parseObject(dtoStr, TextToSpeechFrontDto.class);

        TextToSpeechVo result = bvModelService.textToSpeech(dto);
        return Result.ok();
    }

}
